package com.JavaNet.chapter2_io;


//import sun.nio.cs.GBK;

import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.*;
import java.util.SortedMap;

/**
 * @author : wushikai
 * <p>
 * date : 2021-04-18
 */
public class EncodeDemo {



    private static  final String WORD = "我操, 无情";  //演示字符串
    private static byte[] bytes = {-26, -120, -111, -26, -109, -115, 44, 32, -26, -105, -96, -26, -125, -123}; // "我操, 无情" 对应的 utf-8 编码字节值

    /**
     * 打印字节数组
     * @param bs 字节数组
     * */
    private static void print(byte[] bs) {

        for (byte b : bs) {
            System.out.print(b + " , ");
        }
        System.out.println();
    }

    /**
     * 获取Java支持的全部字符集
     * */
    private static void showCharsets() {

        SortedMap<String, Charset> map = Charset.availableCharsets();
        System.out.println("Java支持的字符集: ");
        System.out.println(map.toString());

    }

    /**
     * 同一个字符串 不同的编码方式 得到不同的 字节数据
     * */
    private static void showStrInCharset() {
        System.out.println("同一个 字节串 数据 ");
        print(bytes);

        byte[] wordBytes = WORD.getBytes();
        print(wordBytes);


        String str;
        str = new String(bytes, StandardCharsets.UTF_8);
        System.out.println("utf-8==>" + str);  // "我操, 无情"
        // str = new String(bytes, Charset.forName("gbk"));
        // str = new String(bytes,"gbk");  //异常处理
        str = new String(bytes, StandardCharsets.ISO_8859_1);
        System.out.println("gbk==>  " + str);  //鎴戞搷, 鏃犳儏

    }


    /**
     * NIO 方式 String 转 字节数据
     * */
    private static ByteBuffer charBuffer2byteBuffer() {
        // 创建简体中文对应的Charset
        Charset charset = Charset.forName("GBK");
        // 获取charset对象对应的编码器
        CharsetEncoder charsetEncoder = charset.newEncoder();
        // 创建一个CharBuffer对象
        CharBuffer charBuffer = CharBuffer.allocate(20);
        charBuffer.put(WORD);
        charBuffer.flip();
        // 将CharBuffer中的字符序列转换成字节序列
        ByteBuffer byteBuffer = null;
        try {
            byteBuffer = charsetEncoder.encode(charBuffer);
        } catch (CharacterCodingException e) {
            e.printStackTrace();
        }
        // 循环访问ByteBuffer中的每个字节
        for (int i = 0; i < byteBuffer.limit(); i++) {
            System.out.print(byteBuffer.get(i) + " ");
        }

        return byteBuffer;

    }

    /**
     * NIO 方式 字节数据 转 字符串
     * */
    private static void byteBuffer2CharBuffer() {
        // 创建简体中文对应的Charset
        Charset charset = Charset.forName("GBK");
        // 获取charset对象对应的编码器
        CharsetDecoder charsetDecoder = charset.newDecoder();

        try {

            // 将ByteBuffer的数据解码成字符序列
            System.out.println(charsetDecoder.decode(charBuffer2byteBuffer()));
        } catch (CharacterCodingException e) {
            e.printStackTrace();
        }


    }


    public static void main(String[] args) {


           showStrInCharset();

        // showCharsets();

      //  charBuffer2byteBuffer();
      //  byteBuffer2CharBuffer();

    }

}
